///////////////////////////////////////////////////////////////////////////////
//
//  The contents of this file are subject to the Mozilla Public License
//  Version 1.1 (the "License"); you may not use this file except in
//  compliance with the License. You may obtain a copy of the License at
//  http://www.mozilla.org/MPL/
//
//  Software distributed under the License is distributed on an "AS IS"
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//  License for the specific language governing rights and limitations
//  under the License.
//
//  The Original Code is MP4v2.
//
//  The Initial Developer of the Original Code is Kona Blend.
//  Portions created by Kona Blend are Copyright (C) 2008.
//  All Rights Reserved.
//
//  Contributors:
//      Kona Blend, kona8lend@@gmail.com
//      Rouven Wessling, mp4v2@rouvenwessling.de
//
///////////////////////////////////////////////////////////////////////////////

#ifndef MP4V2_IMPL_ITMF_TYPE_H
#define MP4V2_IMPL_ITMF_TYPE_H

namespace mp4v2
{
    namespace impl
    {
        namespace itmf
        {

            ///////////////////////////////////////////////////////////////////////////////

            /// Basic set of types as detailed in spec.
            enum BasicType
            {
                BT_IMPLICIT  = 0,   ///< for use with tags for which no type needs to be indicated
                BT_UTF8      = 1,   ///< without any count or null terminator
                BT_UTF16     = 2,   ///< also known as UTF-16BE
                BT_SJIS      = 3,   ///< deprecated unless it is needed for special Japanese characters
                BT_HTML      = 6,   ///< the HTML file header specifies which HTML version
                BT_XML       = 7,   ///< the XML header must identify the DTD or schemas
                BT_UUID      = 8,   ///< also known as GUID; stored as 16 bytes in binary (valid as an ID)
                BT_ISRC      = 9,   ///< stored as UTF-8 text (valid as an ID)
                BT_MI3P      = 10,  ///< stored as UTF-8 text (valid as an ID)
                BT_GIF       = 12,  ///< (deprecated) a GIF image
                BT_JPEG      = 13,  ///< a JPEG image
                BT_PNG       = 14,  ///< a PNG image
                BT_URL       = 15,  ///< absolute, in UTF-8 characters
                BT_DURATION  = 16,  ///< in milliseconds, 32-bit integer
                BT_DATETIME  = 17,  ///< in UTC, counting seconds since midnight, January 1, 1904; 32 or 64-bits
                BT_GENRES    = 18,  ///< a list of enumerated values, see #Genre
                BT_INTEGER   = 21,  ///< a signed big-endian integer with length one of { 1,2,3,4,8 } bytes
                BT_RIAA_PA   = 24,  ///< RIAA parental advisory; { -1=no, 1=yes, 0=unspecified }, 8-bit ingteger
                BT_UPC       = 25,  ///< Universal Product Code, in text UTF-8 format (valid as an ID)
                BT_BMP       = 27,  ///< Windows bitmap image

                BT_UNDEFINED = 255
            };

            typedef Enum<BasicType, BT_UNDEFINED> EnumBasicType;
            MP4V2_EXPORT extern const EnumBasicType enumBasicType;

            ///////////////////////////////////////////////////////////////////////////////

            /// enumerated genre as defined in ID3v1 specification but +1 as per iTMF spec.
            /// Note values 80 and higher are Winamp extensions.
            enum GenreType
            {
                GENRE_UNDEFINED          = 0,

                /* ID3v1 standard */
                GENRE_BLUES              = 1,
                GENRE_CLASSIC_ROCK       = 2,
                GENRE_COUNTRY            = 3,
                GENRE_DANCE              = 4,
                GENRE_DISCO              = 5,
                GENRE_FUNK               = 6,
                GENRE_GRUNGE             = 7,
                GENRE_HIP_HOP            = 8,
                GENRE_JAZZ               = 9,
                GENRE_METAL              = 10,
                GENRE_NEW_AGE            = 11,
                GENRE_OLDIES             = 12,
                GENRE_OTHER              = 13,
                GENRE_POP                = 14,
                GENRE_R_AND_B            = 15,
                GENRE_RAP                = 16,
                GENRE_REGGAE             = 17,
                GENRE_ROCK               = 18,
                GENRE_TECHNO             = 19,
                GENRE_INDUSTRIAL         = 20,
                GENRE_ALTERNATIVE        = 21,
                GENRE_SKA                = 22,
                GENRE_DEATH_METAL        = 23,
                GENRE_PRANKS             = 24,
                GENRE_SOUNDTRACK         = 25,
                GENRE_EURO_TECHNO        = 26,
                GENRE_AMBIENT            = 27,
                GENRE_TRIP_HOP           = 28,
                GENRE_VOCAL              = 29,
                GENRE_JAZZ_FUNK          = 30,
                GENRE_FUSION             = 31,
                GENRE_TRANCE             = 32,
                GENRE_CLASSICAL          = 33,
                GENRE_INSTRUMENTAL       = 34,
                GENRE_ACID               = 35,
                GENRE_HOUSE              = 36,
                GENRE_GAME               = 37,
                GENRE_SOUND_CLIP         = 38,
                GENRE_GOSPEL             = 39,
                GENRE_NOISE              = 40,
                GENRE_ALTERNROCK         = 41,
                GENRE_BASS               = 42,
                GENRE_SOUL               = 43,
                GENRE_PUNK               = 44,
                GENRE_SPACE              = 45,
                GENRE_MEDITATIVE         = 46,
                GENRE_INSTRUMENTAL_POP   = 47,
                GENRE_INSTRUMENTAL_ROCK  = 48,
                GENRE_ETHNIC             = 49,
                GENRE_GOTHIC             = 50,
                GENRE_DARKWAVE           = 51,
                GENRE_TECHNO_INDUSTRIAL  = 52,
                GENRE_ELECTRONIC         = 53,
                GENRE_POP_FOLK           = 54,
                GENRE_EURODANCE          = 55,
                GENRE_DREAM              = 56,
                GENRE_SOUTHERN_ROCK      = 57,
                GENRE_COMEDY             = 58,
                GENRE_CULT               = 59,
                GENRE_GANGSTA            = 60,
                GENRE_TOP_40             = 61,
                GENRE_CHRISTIAN_RAP      = 62,
                GENRE_POP_FUNK           = 63,
                GENRE_JUNGLE             = 64,
                GENRE_NATIVE_AMERICAN    = 65,
                GENRE_CABARET            = 66,
                GENRE_NEW_WAVE           = 67,
                GENRE_PSYCHEDELIC        = 68,
                GENRE_RAVE               = 69,
                GENRE_SHOWTUNES          = 70,
                GENRE_TRAILER            = 71,
                GENRE_LO_FI              = 72,
                GENRE_TRIBAL             = 73,
                GENRE_ACID_PUNK          = 74,
                GENRE_ACID_JAZZ          = 75,
                GENRE_POLKA              = 76,
                GENRE_RETRO              = 77,
                GENRE_MUSICAL            = 78,
                GENRE_ROCK_AND_ROLL      = 79,

                /* Winamp extension */
                GENRE_HARD_ROCK          = 80,
                GENRE_FOLK               = 81,
                GENRE_FOLK_ROCK          = 82,
                GENRE_NATIONAL_FOLK      = 83,
                GENRE_SWING              = 84,
                GENRE_FAST_FUSION        = 85,
                GENRE_BEBOB              = 86,
                GENRE_LATIN              = 87,
                GENRE_REVIVAL            = 88,
                GENRE_CELTIC             = 89,
                GENRE_BLUEGRASS          = 90,
                GENRE_AVANTGARDE         = 91,
                GENRE_GOTHIC_ROCK        = 92,
                GENRE_PROGRESSIVE_ROCK   = 93,
                GENRE_PSYCHEDELIC_ROCK   = 94,
                GENRE_SYMPHONIC_ROCK     = 95,
                GENRE_SLOW_ROCK          = 96,
                GENRE_BIG_BAND           = 97,
                GENRE_CHORUS             = 98,
                GENRE_EASY_LISTENING     = 99,
                GENRE_ACOUSTIC           = 100,
                GENRE_HUMOUR             = 101,
                GENRE_SPEECH             = 102,
                GENRE_CHANSON            = 103,
                GENRE_OPERA              = 104,
                GENRE_CHAMBER_MUSIC      = 105,
                GENRE_SONATA             = 106,
                GENRE_SYMPHONY           = 107,
                GENRE_BOOTY_BASS         = 108,
                GENRE_PRIMUS             = 109,
                GENRE_PORN_GROOVE        = 110,
                GENRE_SATIRE             = 111,
                GENRE_SLOW_JAM           = 112,
                GENRE_CLUB               = 113,
                GENRE_TANGO              = 114,
                GENRE_SAMBA              = 115,
                GENRE_FOLKLORE           = 116,
                GENRE_BALLAD             = 117,
                GENRE_POWER_BALLAD       = 118,
                GENRE_RHYTHMIC_SOUL      = 119,
                GENRE_FREESTYLE          = 120,
                GENRE_DUET               = 121,
                GENRE_PUNK_ROCK          = 122,
                GENRE_DRUM_SOLO          = 123,
                GENRE_A_CAPELLA          = 124,
                GENRE_EURO_HOUSE         = 125,
                GENRE_DANCE_HALL         = 126,

                GENRE_NONE = 255
            };

            typedef Enum<GenreType, GENRE_UNDEFINED> EnumGenreType;
            MP4V2_EXPORT extern const EnumGenreType enumGenreType;

            ///////////////////////////////////////////////////////////////////////////////

            /// enumerated 8-bit Video Type used by iTunes.
            /// Note values are not formally defined in any specification.
            enum StikType
            {
                STIK_OLD_MOVIE   = 0,
                STIK_NORMAL      = 1,
                STIK_AUDIOBOOK   = 2,
                STIK_MUSIC_VIDEO = 6,
                STIK_MOVIE       = 9,
                STIK_TV_SHOW     = 10,
                STIK_BOOKLET     = 11,
                STIK_RINGTONE    = 14,

                STIK_UNDEFINED   = 255
            };

            typedef Enum<StikType, STIK_UNDEFINED> EnumStikType;
            MP4V2_EXPORT extern const EnumStikType enumStikType;

            ///////////////////////////////////////////////////////////////////////////////

            /// enumerated 8-bit Account Type used by the iTunes Store.
            /// Note values are not formally defined in any specification.
            enum AccountType
            {
                AT_ITUNES    = 0,
                AT_AOL       = 1,

                AT_UNDEFINED = 255
            };

            typedef Enum<AccountType, AT_UNDEFINED> EnumAccountType;
            MP4V2_EXPORT extern const EnumAccountType enumAccountType;

            ///////////////////////////////////////////////////////////////////////////////

            /// enumerated 32-bit Country Code used by the iTunes Store.
            /// Note values are not formally defined in any specification.
            enum CountryCode
            {
                CC_USA   = 143441,
                CC_FRA   = 143442,
                CC_DEU   = 143443,
                CC_GBR   = 143444,
                CC_AUT   = 143445,
                CC_BEL   = 143446,
                CC_FIN   = 143447,
                CC_GRC   = 143448,
                CC_IRL   = 143449,
                CC_ITA   = 143450,
                CC_LUX   = 143451,
                CC_NLD   = 143452,
                CC_PRT   = 143453,
                CC_ESP   = 143454,
                CC_CAN   = 143455,
                CC_SWE   = 143456,
                CC_NOR   = 143457,
                CC_DNK   = 143458,
                CC_CHE   = 143459,
                CC_AUS   = 143460,
                CC_NZL   = 143461,
                CC_JPN   = 143462,

                CC_UNDEFINED = 0
            };

            typedef Enum<CountryCode, CC_UNDEFINED> EnumCountryCode;
            MP4V2_EXPORT extern const EnumCountryCode enumCountryCode;

            ///////////////////////////////////////////////////////////////////////////////

            /// enumerated 8-bit Content Rating used by iTunes.
            /// Note values are not formally defined in any specification.
            enum ContentRating
            {
                CR_NONE      = 0,
                CR_CLEAN     = 2,
                CR_EXPLICIT  = 4,

                CR_UNDEFINED = 255
            };

            typedef Enum<ContentRating, CR_UNDEFINED> EnumContentRating;
            MP4V2_EXPORT extern const EnumContentRating enumContentRating;

            ///////////////////////////////////////////////////////////////////////////////
            /// compute BasicType by examining raw bytes header.
            MP4V2_EXPORT BasicType
            computeBasicType( const void *buffer, uint32_t size );

            ///////////////////////////////////////////////////////////////////////////////

        }
    }
} // namespace mp4v2::impl::itmf

#endif // MP4V2_IMPL_ITMF_TYPE_H
